﻿// Sherlock and His Girlfriend.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//


/*

http://ybt.ssoier.cn:8088/problem_show.php?pid=1623

https://loj.ac/p/10201

原题来自：Codeforces Round #400 B.

Sherlock 有了一个新女友（这太不像他了！）。情人节到了，他想送给女友一些珠宝当做礼物。

他买了 n 件珠宝。第 i 件的价值是 i+1。那就是说，珠宝的价值分别为 2,3,4,⋯,n+1。

Watson 挑战 Sherlock，让他给这些珠宝染色，使得一件珠宝的价格是另一件的质因子时，两件珠宝的颜色不同。并且，Watson 要求他最小化颜色的使用数。

请帮助 Sherlock 完成这个简单的任务。

【输入】
只有一行一个整数 n，表示珠宝件数。

【输出】
第一行一个整数 k，表示最少的染色数；

第二行 n 个整数，表示第 1 到第 n 件珠宝被染成的颜色。若有多种答案，输出任意一种。

【输入样例】
3
【输出样例】
2
1 1 2
【提示】
样例输入 2

4
样例输出 2

2
2 1 1 2
样例说明

因为 2 是 4 的一个质因子，因此第一件珠宝与第三件珠宝的颜色必须不同。

数据范围与提示：

对于全部数据，1≤n≤105 。
*/


#include <iostream>

using  namespace std;

const int N = 100010;
int n;

int primes[N], cnt;     // primes[]存储所有素数
bool st[N];         // st[x]存储x是否被筛掉

void get_primes(int n)
{
    for (int i = 2; i <= n; i++)
    {
        if (!st[i]) primes[cnt++] = i;
        for (int j = 0; primes[j] <= n / i; j++)
        {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0) break;
        }
    }
}

int main()
{
    cin >> n; n += 1;
    get_primes(n);
    if (n == 2) {
        cout << 1 << endl << 1 << endl;
        return 0;
    }
    else if (n == 3) {
        cout << 1 << endl << 1 <<" " << 1 << endl;
        return 0;
    }

    cout << 2 << endl;
    for (int i = 2; i <= n; i++) {
        if (st[i] == false) {
            cout << 1 << " ";
        }
        else {
            cout << 2 << " ";
        }
    }
    cout << endl;


	return 0;
}
